#ifndef __MOTOR_H
#define __MOTOR_H

#include "GPIO.h"
#include "STC8H_PWM.h"
#include "Switch.h"
#include "NVIC.h"

#define PERIOD MAIN_Fosc / 1000

#define LQ_B P17
#define LQ_F P16
#define RQ_B P15
#define RQ_F P14
#define LH_B P20
#define LH_F P21
#define RH_B P23
#define RF_F P22

#define SPEED_MIN 10
#define SPEED_MAX_CURVE 80
#define SPEED_MAX 200

// 慢速转弯左右轮速度之比
#define SLOW_TURN_RATIO 2
// 慢速转弯左右轮速度差 直60 弯40
#define SLOW_TURN_DIF 60


/*
  占空比是50 的时候电机处于正传倒转相持，导致停止
  正传占空比从50到100 对应正传的速度0-100 
  反传占空比从0到50   对应反传的速度0-100, 但这里用了Mode的翻转，而不是占空比0-50
  所以前进和倒退的占空比都是50-100
  注意：speed是u8类型的运算结果默认是u8类型，
        结果超出u8范围，必须要用int类型变量接收，才能拿到正确结果
 */
#define SPEED2DUTY(speed) ((PERIOD * (50 + (speed) / 2)) / 100)


// 电机编号
typedef enum {
	NO_LQ = 1, NO_RQ, NO_LH, NO_RH
} MOTOR_NO;

// 电机状态
typedef enum {
	FORWARD = 1, BACKWORD, STOP
} MOTOR_STATE;

// 描述电机的结构体
typedef struct MOTOR_DESC {
	MOTOR_NO motor_no;
	MOTOR_STATE motor_state;
	u8 speed; // 10-100
}MOTOR_DESC;

// 电机初始化
void motor_init();


// 哪个电机前进或后退或停止
void motor_movement(MOTOR_DESC motor);


// 直行 - 全速前进
void motor_go_straight(u8 speed);


// 后退 - 全速后退
void motor_go_back(u8 speed);


// 停止
void motor_stop();


// 左转 - 左边轮不动，右边轮转
void motor_turn_left(u8 speed);


// 右转 - 右边轮不动，左边轮全速前进
void motor_turn_right(u8 speed);


// 左转 - 柔和版 左边轮慢速前进，右边轮全速前进
void motor_turn_left_slow(u8 speed);


// 右转 - 柔和版 右边轮慢速前进，左边轮全速前进
void motor_turn_right_slow(u8 speed);








/*
  N20电机,额定电压为6V，最大转速是300RPM（300圈/分钟）
  电机驱动芯片
  1 - 高电平后退
  2 - 高电平前进
  接了PWMA的四组对应引脚 - 可以使1，2引脚不同时为高电平
 */




#endif
